use std::fmt::Display;

// 泛型函数
fn prefixed_println<T: Display + ?Sized>(t: &T) {   // 类型为T，并且需要拥有Display trait，可以没有Sized trait
    println!("argument: {}", t);
}

struct Holder<T> {
    val: T
}

impl Holder<i32> {  // impl后面写T，类型名后写，表示特定类型
    fn special(&self) -> String {
        String::from("special method for i32")
    }
}

impl<T> Holder<T> { //impl后的T表示泛型类型为T
    fn common(&self) -> String {
        String::from("common method")
    }
}



fn main() {
    let i_holder = Holder{
        val: 32
    };
    let s_holder = Holder{
        val: String::from("string")
    };
    println!("{}", i_holder.common());
    println!("{}", i_holder.special());
    println!("{}", s_holder.common());
}
